home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Ham⁄GPS / SoftKiss.src.1.8 Folder / SoftKiss.src.1.8.sit / SoftKiss.src.1.8 / lib / sfk_dyntext.c < prev    next >
Text File  |  1993-03-08  |  1KB  |  66 lines

  1. /*
  2.  * sfk_dyntext.c - dynamicly loaded text
  3.  */
  4.  
  5. #include "sfk_codecheck.h"
  6. #include "sfk_dyntext.h"
  7. #include <string.h>
  8.  
  9. typedef unsigned short uint16;
  10.  
  11. /*
  12.  * clean up a dt text block
  13.  */
  14. void sfk_dt_free(dyn_text_pt dt)
  15. {
  16.     if((dt->fr!=0)&&(dt->tstrs!=0)) {
  17.         (dt->fr)(dt->tstrs);
  18.         dt->tstrs=0;
  19.     }
  20.     if((dt->thand!=0)&&(dt->dispose_thand))
  21.         DisposeHandle(dt->thand);
  22.     dt->thand=0;
  23.     dt->dispose_thand=0;
  24. }
  25.  
  26. /*
  27.  * read in a dynamic text block
  28.  * return TRUE if successfull
  29.  */
  30. int sfk_dt_load(short res_id,dyn_text_pt dt,alloc_rtn ar,free_rtn fr)
  31. {
  32.     unsigned char *s;
  33.     unsigned short len;
  34.     unsigned short nstrs;
  35.     unsigned short *dst;
  36.     memset(dt,0,sizeof(*dt));
  37.     dt->fr=fr;
  38.     if((dt->thand=(void*)GetResource('STR#',res_id))==0)
  39.         return FALSE;
  40.     HUnlock(dt->thand);
  41.     if(MemError()!=0)goto fail;
  42.     MoveHHi(dt->thand);
  43.     HLock(dt->thand);
  44.     if(MemError()!=0)goto fail;
  45.     DetachResource(dt->thand);
  46.     if(ResError()!=0)goto fail;
  47.     // dt->dispose_thand=TRUE;
  48.     dt->tptr=(void*)StripAddress(*(dt->thand));
  49.     dt->nstrs= (*((unsigned short*)(dt->tptr)));
  50.     dt->tstrs= (*ar)((dt->nstrs+1)*sizeof(unsigned short));
  51.     s=dt->tptr+2;
  52.     dst= dt->tstrs;
  53.     *dst++=0;
  54.     for(nstrs=dt->nstrs;nstrs>0;nstrs--) {
  55.         len= *s;
  56.         PtoCstr(s);
  57.         *dst++= (s-dt->tptr);
  58.         s+= (len+1);
  59.     }
  60.   return TRUE;
  61.  
  62.   fail:
  63.       sfk_dt_free(dt);
  64.       return FALSE;
  65. }
  66.